//! Startup OS-a

#include "postavke.h"
#include "ispis.h"
#include "razno.h"
#include "prekidi.h"
#include "vrijeme.h"
#include "tipkovnica.h"
#include "dretve.h"
#include "procesi.h"
#include "spremnik.h"

#include <programi.h>

//za zavrsetak "pocetne dretve", nakon sto inicijalizira sustav "izlazi"
extern void izadji_iz_jezgre(); //definirana u arh sloju

/*!
 * Funkcija koja je pozvana odmah iz asemblerskog koda kod samog pocetka
 * bootanja.
 * \param magic Bootloader magicni broj
 * \param addr Adresa multiboot_info_t strukture
 */

void j_pocetak (unsigned long magic, unsigned long addr)
{
	/* inicijalizacija svega */

	j_inicijaliziraj_spremnik();

	j_ispis_inicijaliziraj();

	j_prekidi_inicijaliziraj();

	j_visedretvenost_inicijaliziraj();

	j_sat_inicijaliziraj();

	j_tipkovnica_inicijaliziraj(ISTINA);

	j_ispisi("<%s:%s:%s>\nSustav inicijaliziran!\n\n",
		AUTOR, PROJEKT, PLATFORMA);

	//stvori pocetne procese
	struct {
		void (*poc_funkc)(void *);	//pocetna funckija dreve
		void *param;			//parametar za stog
		void *stog;			//pocetni stog
		int prio;			//prioritet
		int rasp;			//koji rasporedjivac? FIFO, RR

		bool u_jezgri;
		void *pocetna_adresa;
		uint32 velicina;
	} pd;

	pd.param = NULL;
	pd.stog = NULL;
	pd.rasp = RASP_PRP;

	//latentna dretva (idle dretva)
	pd.poc_funkc = latentna_dretva; //kada bi radio s absolutnim adresama
					//trebalo bi ovu adresu zbrojit
					//s pocetkom adresnog prostora programa
	pd.prio = PRIO_MIN;
	pd.u_jezgri = ISTINA;
	pd.pocetna_adresa = (void *) 0;
	pd.velicina = 0; //0xffffffff - ako se zeli da ostane u abs. adresama
			 //i adresira cijeli adresni prostor!
	j_stvori_proces (&pd);

	//pocetni "korisni" proces
	pd.poc_funkc = pocetna_dretva;
	pd.prio = PRIO_MAX;
	pd.u_jezgri = NEISTINA;
	pd.pocetna_adresa = NULL;
	pd.velicina = 0;
	j_stvori_proces (&pd);

	//test proces koji "vidi sve"
	pd.poc_funkc = proces_x;
	extern void *pproces_x_stog;
	pd.stog = pproces_x_stog;
	pd.prio = PRIO_MAX;
	pd.u_jezgri = ISTINA;
	pd.pocetna_adresa = NULL;
	pd.velicina = 0xffffffff;
	j_stvori_proces (&pd);

	//zavrsi "ovu" pocetnu dretvu
	izadji_iz_jezgre();
}
